Extra tracing in Xen to support XenMon.
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Tue, 15 Nov 2005 13:59:59 +0000 (14:59 +0100)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Tue, 15 Nov 2005 13:59:59 +0000 (14:59 +0100)
Signed-off-by: Rob Gardner <rob.gardner@hp.com>
I also appied some fixes and simplifications to the tracing.
Signed-off-by: Keir Fraser <keir@xensource.com>
xen/common/grant_table.c
xen/common/schedule.c
xen/include/public/trace.h

index 6425ab8f9fe9f817a9adb927a79492cb11d1c374..f1b4d345ed6aaf0c64647cb83bc2cdaa7d4e6c37 100644 (file)
@@ -29,6 +29,7 @@
 #include <xen/shadow.h>
 #include <xen/mm.h>
 #include <acm/acm_hooks.h>
+#include <xen/trace.h>
 
 #if defined(CONFIG_X86_64)
 #define GRANT_PTE_FLAGS (_PAGE_PRESENT|_PAGE_ACCESSED|_PAGE_DIRTY|_PAGE_USER)
@@ -379,6 +380,8 @@ __gnttab_map_grant_ref(
         }
     }
 
+    TRACE_1D(TRC_MEM_PAGE_GRANT_MAP, dom);
+
     ld->grant_table->maptrack[handle].domid         = dom;
     ld->grant_table->maptrack[handle].ref_and_flags =
         (ref << MAPTRACK_REF_SHIFT) |
@@ -463,6 +466,8 @@ __gnttab_unmap_grant_ref(
         return GNTST_bad_domain;
     }
 
+    TRACE_1D(TRC_MEM_PAGE_GRANT_UNMAP, dom);
+
     act = &rd->grant_table->active[ref];
     sha = &rd->grant_table->shared[ref];
 
@@ -802,6 +807,8 @@ gnttab_transfer(
         page_set_owner(page, e);
         
         spin_unlock(&e->page_alloc_lock);
+
+        TRACE_1D(TRC_MEM_PAGE_GRANT_TRANSFER, e->domain_id);
         
         /* Tell the guest about its new page frame. */
         sha = &e->grant_table->shared[gop->ref];
index 3c0d50bfc89cfa9cc39117794a27022463047447..7a0b6223731e9403721b57f2c509374141e12264 100644 (file)
  *
  */
 
-/*#define WAKE_HISTO*/
-/*#define BLOCKTIME_HISTO*/
-
-#if defined(WAKE_HISTO)
-#define BUCKETS 31
-#elif defined(BLOCKTIME_HISTO)
-#define BUCKETS 200
-#endif
-
 #include <xen/config.h>
 #include <xen/init.h>
 #include <xen/lib.h>
@@ -45,6 +36,8 @@ extern void arch_getdomaininfo_ctxt(struct vcpu *,
 static char opt_sched[10] = "sedf";
 string_param("sched", opt_sched);
 
+/*#define WAKE_HISTO*/
+/*#define BLOCKTIME_HISTO*/
 #if defined(WAKE_HISTO)
 #define BUCKETS 31
 #elif defined(BLOCKTIME_HISTO)
@@ -205,9 +198,7 @@ void vcpu_wake(struct vcpu *v)
     if ( likely(domain_runnable(v)) )
     {
         SCHED_OP(wake, v);
-#ifdef WAKE_HISTO
         v->wokenup = NOW();
-#endif
     }
     clear_bit(_VCPUF_cpu_migrated, &v->vcpu_flags);
     spin_unlock_irqrestore(&schedule_data[v->processor].schedule_lock, flags);
@@ -416,11 +407,26 @@ static void __enter_scheduler(void)
         return continue_running(prev);
     }
 
+    TRACE_2D(TRC_SCHED_SWITCH_INFPREV,
+             prev->domain->domain_id, now - prev->lastschd);
+    TRACE_3D(TRC_SCHED_SWITCH_INFNEXT,
+             next->domain->domain_id, now - next->wokenup, r_time);
+
     clear_bit(_VCPUF_running, &prev->vcpu_flags);
     set_bit(_VCPUF_running, &next->vcpu_flags);
 
     perfc_incrc(sched_ctx);
 
+    /*
+     * Logic of wokenup field in domain struct:
+     * Used to calculate "waiting time", which is the time that a domain
+     * spends being "runnable", but not actually running. wokenup is set
+     * set whenever a domain wakes from sleeping. However, if wokenup is not
+     * also set here then a preempted runnable domain will get a screwed up
+     * "waiting time" value next time it is scheduled.
+     */
+    prev->wokenup = NOW();
+
 #if defined(WAKE_HISTO)
     if ( !is_idle_task(next->domain) && next->wokenup )
     {
index 47b4bdd18988590052724b106485fc4e5a448fe9..cdcf447c1081511dd89ad94cb74ad141494b4019 100644 (file)
@@ -14,6 +14,7 @@
 #define TRC_SCHED   0x0002f000    /* Xen Scheduler trace      */
 #define TRC_DOM0OP  0x0004f000    /* Xen DOM0 operation trace */
 #define TRC_VMX     0x0008f000    /* Xen VMX trace            */
+#define TRC_MEM     0x000af000    /* Xen memory trace         */
 #define TRC_ALL     0xfffff000
 
 /* Trace subclasses */
 #define TRC_SCHED_S_TIMER_FN    (TRC_SCHED + 11)
 #define TRC_SCHED_T_TIMER_FN    (TRC_SCHED + 12)
 #define TRC_SCHED_DOM_TIMER_FN  (TRC_SCHED + 13)
+#define TRC_SCHED_SWITCH_INFPREV (TRC_SCHED + 14)
+#define TRC_SCHED_SWITCH_INFNEXT (TRC_SCHED + 15)
+
+#define TRC_MEM_PAGE_GRANT_MAP      (TRC_MEM + 1)
+#define TRC_MEM_PAGE_GRANT_UNMAP    (TRC_MEM + 2)
+#define TRC_MEM_PAGE_GRANT_TRANSFER (TRC_MEM + 3)
 
 /* trace events per subclass */
 #define TRC_VMX_VMEXIT          (TRC_VMXEXIT + 1)